// admin 模块的业务逻辑层
const md5 = require("md5");
const jwt = require("jsonwebtoken");
const {
  loginDao,
  updateAdminDao,
  adminInfoByPkDao,
} = require("../dao/adminDao");
const { ValidationError } = require("../utils/error");
const { formatResponse } = require("../utils/tool");

module.exports.loginService = async function (loginInfo) {
  loginInfo.password = md5(loginInfo.password); // 进行加密
  // 接下来进行数据的验证，也就是查询该条数据在数据库里面有没有
  let data = await loginDao(loginInfo);
  if (data && data.dataValues) {
    const { dataValues } = data;
    // 添加 token
    data = {
      id: dataValues.id,
      loginId: dataValues.loginId,
      username: dataValues.username,
    };
    const loginPeriod = loginInfo.remember ? 7 : 1;
    const token = jwt.sign(data, md5(process.env.JWT_SECRET), {
      expiresIn: loginPeriod * 24 * 60 * 60,
    });
    return { token, data };
  }
  return { data };
};

// 修改管理员信息 (这里目前只能修改用户名)
module.exports.updateAdminService = async function (userInfo) {
  // userInfo.oldPassword = md5(userInfo.oldPassword); // 进行加密
  // userInfo.newPassword = md5(userInfo.newPassword); // 新密码加密
  let data = await adminInfoByPkDao(userInfo.id);

  if (data && data.dataValues) {
    await updateAdminDao({
      ...data.dataValues,
      username: userInfo.username,
    });
    return formatResponse(0, "", {
      id: data.dataValues.id,
      loginId: data.dataValues.loginId,
      username: userInfo.username,
    });
  } else {
    throw new ValidationError("用户不存在");
  }
};

// 修改密码
module.exports.updatePasswordService = async function (userInfo) {
  if (userInfo.oldPassword === userInfo.newPassword) {
    throw new ValidationError("新密码不能与旧密码相同");
  }
  userInfo.oldPassword = md5(userInfo.oldPassword); // 旧密码加密
  userInfo.newPassword = md5(userInfo.newPassword); // 新密码加密

  let data = await loginDao({
    loginId: userInfo.loginId,
    password: userInfo.oldPassword,
  });
  if (data && data.dataValues) {
    await updateAdminDao({
      ...data.dataValues,
      password: userInfo.newPassword,
    });
    return formatResponse(0, "", {
      id: data.dataValues.id,
      loginId: data.dataValues.loginId,
      username: data.dataValues.username,
    });
  } else {
    throw new ValidationError("旧密码错误");
  }
};
